www.gusucode.com > VC++ 屏幕截取(窗口截图、选区截图)、屏幕拾色器、放大镜 > VC++ 屏幕截取(窗口截图、选区截图)、屏幕拾色器、放大镜/code/ScreenTool/SnapWindowDlg.cpp

    // SnapWindowDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "ScreenTool.h"
#include "SnapWindowDlg.h"
#include "common.h"
#include <atlimage.h>
// CSnapWindowDlg 对话框
CSnapWindowDlg::CSnapWindowDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSnapWindowDlg::IDD, pParent)
{
	m_hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR1);
	m_rectOfWndBmp = NULL;
	m_preWnd = NULL;
	m_curWnd = NULL;
	m_bSnap = FALSE;
}

CSnapWindowDlg::~CSnapWindowDlg()
{
}
BOOL CSnapWindowDlg::OnInitDialog()
{
	return TRUE;
}
void CSnapWindowDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}
void CSnapWindowDlg::ClearScreen()
{
	HDC hScreenDC;
	//创建屏幕设备表述表
	hScreenDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
	//假如先前窗口不为NULL 则清除在窗口上所绘制的矩形框
	HDC hMemDC;
	//创建与屏幕兼容的内存设备描述表句柄	
	hMemDC = CreateCompatibleDC(hScreenDC);	
	//将先前保存的窗口区域位图选进设备表述表当中
	SelectObject(hMemDC, m_rectOfWndBmp);
	//将先前保存的窗口区域位图拷贝到屏幕
	BitBlt(hScreenDC, m_rectOfWnd.left, m_rectOfWnd.top, m_rectOfWnd.right - m_rectOfWnd.left, 
			m_rectOfWnd.bottom - m_rectOfWnd.top, hMemDC, 0, 0, SRCCOPY);		
	DeleteObject(m_rectOfWndBmp);
	m_rectOfWndBmp = NULL;
	DeleteDC(hMemDC);
	DeleteDC(hScreenDC);
}
void CSnapWindowDlg::SnapWindow(POINT point)
{
	ClientToScreen(&point);
	HDC hScreenDC;
	//得到鼠标位置的窗口句柄
	m_curWnd = ::WindowFromPoint(point);
	if (m_curWnd == m_preWnd || m_curWnd == m_hWnd || ::GetParent(m_curWnd) == m_curWnd)
		return;
	if (m_rectOfWndBmp != NULL)
		ClearScreen();
	//得到当前窗口矩形区域
	::GetWindowRect(m_curWnd, &m_rectOfWnd);
	if (m_rectOfWnd.left < 0)
		m_rectOfWnd.left = 0;
	if (m_rectOfWnd.top <0)
		m_rectOfWnd.top = 0;
	//保存当前窗口矩形区域的内容
	m_rectOfWndBmp = CopyScreenToBitmap(&m_rectOfWnd);
	m_preWnd = m_curWnd;
	CBrush brush;
	//创建红色画刷
	brush.CreateSolidBrush(RGB(255, 0, 0));
	//创建屏幕设备表述表
	hScreenDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
	//在屏幕窗口位置绘制矩形
	FrameRect(hScreenDC, &m_rectOfWnd, (HBRUSH)brush.m_hObject);
	brush.DeleteObject();
	DeleteDC(hScreenDC);

}
void CSnapWindowDlg::SaveBmpToFile()
{
	//隐藏应用程序窗口
	ShowWindow(SW_HIDE);
	Sleep(100);
	//定义CImage对象,用来将位图保存到一个文件上
	CImage image;
	//定义文件路径
	CString strPathName;
	//定义文件对话框对象
	CFileDialog fd(FALSE, _T("jpg"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 0, NULL);
	//设置文件过滤器
	fd.m_ofn.lpstrFilter = _T("PNG 文件\0*.png\0JPEG 文件\0*.jpg\0位图文件\0*.bmp\0All Files\0*.*\0\0");
	//打开文件对话框
	fd.DoModal();
	//获取选择的文件路经
	strPathName = fd.GetPathName();
	//判断文件路径是否为空
	if(strPathName.IsEmpty())
		goto RET;
	HBITMAP hBitmap = CopyScreenToBitmap(&m_rectOfWnd);
	//将位图句柄关联到image对象
	image.Attach(hBitmap);
	//将位图保存到一个文件上
	image.Save(strPathName);
	DeleteObject(hBitmap);
	//销毁image对象
	image.Destroy();
RET:
	ShowWindow(SW_SHOW);
}
BEGIN_MESSAGE_MAP(CSnapWindowDlg, CDialog)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()


// CSnapWindowDlg 消息处理程序

void CSnapWindowDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	SetCursor(m_hCursor);
	SetCapture();
	m_bSnap = TRUE;
	CDialog::OnLButtonDown(nFlags, point);
}

void CSnapWindowDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	ReleaseCapture();
	ClearScreen();
	SaveBmpToFile();
	m_preWnd = NULL;
	m_curWnd = NULL;
	m_bSnap = FALSE;
	
}

void CSnapWindowDlg::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (m_bSnap)
		SnapWindow(point);
}